'use strict'
const semver = require('semver')
const colors = require('colors/safe')
const log = require('@kac-cli-dev/log')

const LOWEST_NODE_VERSION = '14.0.0'

class Command {
  constructor(argv) {
    // console.log('argv >>> ', argv)
    if (!argv) {
      throw new Error('参数不能为空')
    }
    if (!Array.isArray(argv)) {
      throw new Error('参数必须为数组')
    }
    if (argv.length < 1) {
      throw new Error('参数列表为空')
    }
    this._argv = argv
    let runner = new Promise((resolve, reject) => {
      let chain = Promise.resolve()
      chain = chain.then(() => {
        this.checkNodeVersion()
      })
      chain = chain.then(() => this.initArgs())
      chain = chain.then(() => this.init())
      chain = chain.then(() => this.exec())
      chain.catch((error) => {
        log.error(error.message)
      })
    })
  }
  initArgs() {
    this.cmd = this._argv[this._argv.length - 1]
    this._argv = this._argv.slice(0, this._argv.length - 1)
  }
  checkNodeVersion() {
    // 1. 获取当前 Node 版本
    const currentVersion = process.version
    // 2. 比对最低版本号
    const lowestVersion = LOWEST_NODE_VERSION

    if (!semver.gte(currentVersion, lowestVersion)) {
      throw new Error(
        colors.red(`kac-cli 需要安装 v${lowestVersion} 以上版本的 Node.js`)
      )
    }
  }
  init() {
    throw new Error('init 必须实现')
  }
  exec() {
    throw new Error('exec 必须实现')
  }
}

module.exports = Command
